#include "stdafx.h"
#include "Counter.h"


int getDataTableIndex(COUNTER_TYPE type, char c)
{
	switch(type)
	{
	case NUMBERIC:
		{
			if (c < '0' || c > '9')
				return -1;

			return 9 - ('9' - c );
		}
	case ALPHABETIC_LW:
		{
			if (c < 'a' || c > 'z')
				return -1;

			return 25 - ('z' - c);
		}
	case ALPHABETIC_UP:
		{
			if (c < 'A' || c > 'Z')
				return -1;

			return 25 - ('Z' - c);
		}
	case ALPHABETIC_MX:
		//"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
		{
			if (c >= 'A' && c <= 'Z') {
				return  25 - ('Z' - c);
			}
			else if (c >= 'a' && c <= 'z') {
				return 25 - ('z' - c) + 26;
			}
			else 
				return -1;
		}
	case ALPHANUMBERIC_LW:
		//"0123456789abcdefghijklmnopqrstuvwxyz"
		{
			if (c >= '0' && c <= '9') {
				return  9 - ('9' - c);
			}
			else if (c >= 'a' && c <= 'z') {
				return 25 - ('z' - c) + 10;
			}
			else 
				return -1;
		}
	case ALPHANUMBERIC_UP:
		//"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		{
			if (c >= '0' && c <= '9') {
				return 9 - ('9' - c);
			}
			else if (c >= 'A' && c <= 'Z') {
				return 25 - ('Z' - c) + 10;
			}
			else 
				return -1;
		}
	case ALPHANUMBERIC_MX:
		//p"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		{
			if (c >= '0' && c <= '9') {
				return 9 - ('9' - c);
			}
			else if (c >= 'A' && c <= 'Z') {
				return 25 - ('Z' - c) + 10;
			}
			else if (c >= 'a' && c <= 'z') {
				return 25 - ('z' - c) + 36;
			}
			else 
				return -1;
		}
	default:
		if (c < '0' || c > '9')
			return -1;

		return 9 - ('9' - c );
	}

}

char* getDataTable(COUNTER_TYPE type)
{
	switch(type)
	{
	case NUMBERIC:
		return numTable;
	case ALPHABETIC_LW:
		return abLwTable;
	case ALPHABETIC_UP:
		return abUpTable;
	case ALPHABETIC_MX:
		return abMxTable;
	case ALPHANUMBERIC_LW:
		return abNumLwTable;
	case ALPHANUMBERIC_UP:
		return abNumUpTable;
	case ALPHANUMBERIC_MX:
		return abNumMxTable;
	default:
		return numTable;
	}
}

int getDataTableSize(COUNTER_TYPE type)
{
	switch(type)
	{
	case NUMBERIC:
		return sizeof(numTable)/sizeof(numTable[0]);
	case ALPHABETIC_LW:
		return  sizeof(abLwTable)/sizeof(abLwTable[0]);
	case ALPHABETIC_UP:
		return sizeof(abUpTable)/sizeof(abUpTable[0]);
	case ALPHABETIC_MX:
		return sizeof(abMxTable)/sizeof(abMxTable[0]);
	case ALPHANUMBERIC_LW:
		return sizeof(abNumLwTable)/sizeof(abNumLwTable[0]);
	case ALPHANUMBERIC_UP:
		return sizeof(abNumUpTable)/sizeof(abNumUpTable[0]);
	case ALPHANUMBERIC_MX:
		return sizeof(abNumMxTable)/sizeof(abNumMxTable[0]);
	default:
		return sizeof(numTable)/sizeof(numTable[0]);
	}
}
//
//class CLetter
//{
//public:
//	CLetter(COUNTER_TYPE type = NUMBERIC):m_type(type)
//	{
//		m_max = getDataTableSize(m_type) - 1;
//		m_table = getDataTable(m_type);
//		Reset();
//	}
//
//
//	CLetter(char c,COUNTER_TYPE type = NUMBERIC)
//		:Chr(c), m_type(type)
//	{
//		m_num = getDataTableIndex(m_type, Chr);
//		m_max = getDataTableSize(m_type) - 1;
//		m_table = getDataTable(m_type);
//	}
//
//	void Reset()
//	{
//		m_num = 0;
//		Chr = m_table[m_num];
//	}
//
//	//Whether overflow
//	bool Tick()
//	{
//		++m_num;
//		if (m_num >= m_max) {
//			Reset();
//			return true;
//		}
//		Chr = m_table[m_num];
//		return false;
//	}
//
//	char Chr;
//private:
//	unsigned short m_num;
//	COUNTER_TYPE m_type;
//	int m_max;
//	char* m_table;
//};
//
//class CCounter
//{
//public:
//	CCounter(COUNTER_TYPE type, int bits, std::string startPos)
//		:m_type(type), m_bits(bits), m_start(startPos){
//
//	}
//
//	bool Validate() 
//	{
//		if (m_start.empty()) 
//		{
//			for(int i = 0; i < m_bits; ++i) 
//			{
//				m_letters.push_back(CLetter(m_type));
//			}
//			return true;
//		}
//
//		if ((int)m_start.length() != m_bits)
//			return false;
//
//		//"0123456"
//		//|6|5|4|3|2|1|0|
//
//		for (std::string::reverse_iterator rit = m_start.rbegin(); rit != m_start.rend(); ++rit)
//		{
//			char c = *rit; 
//			if (!ValidateChar(c , m_type))
//				return false;
//
//			m_letters.push_back(CLetter( c, m_type));
//		}
//
//		return true;
//	}
//
//	static bool ValidateChar(char c, COUNTER_TYPE type)
//	{
//		switch(type)
//		{
//		case NUMBERIC:
//			return std::isdigit(c);
//		case ALPHABETIC_LW:
//			return std::isalpha(c) && std::islower(c);
//		case ALPHABETIC_UP:
//			return std::isalpha(c) && std::isupper(c);
//		case ALPHABETIC_MX:
//			return std::isalpha(c);
//		case ALPHANUMBERIC_LW:
//			return std::isdigit(c) || (std::isalpha(c) && std::islower(c));
//		case ALPHANUMBERIC_UP:
//			return std::isdigit(c) || (std::isalpha(c) && std::isupper(c));
//		case ALPHANUMBERIC_MX:
//			return std::isalnum(c);
//		default:
//			return std::isdigit(c);
//		}
//
//		return true; 
//	}
//
//	//Stoped?
//	bool  Tick()
//	{
//		//z,0
//		for (int idx = 0; idx < m_letters.size(); ++idx)
//		{
//			if (!m_letters[idx].Tick()) {
//
//				if (idx == m_letters.size() - 1) return true; 
//				break;
//			}
//		}
//		return false;
//	}
//
//	std::string Value()
//	{
//		std::string str;
//		for(std::vector<CLetter>::reverse_iterator rit = m_letters.rbegin();
//			rit != m_letters.rend(); ++rit) 
//		{
//			CLetter &le = *rit;
//			str.push_back(le.Chr);
//		}
//
//		return str; 
//	}
//private:
//	COUNTER_TYPE m_type;
//	int m_bits;
//	std::string m_start;
//
//	std::vector<CLetter> m_letters;
//};